/*
day481 
2020.12.21 
*/
#include<iostream>
#include<vector>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    	int len1=len(l1),len2=len(l2);
    	if(len2>len1)
    	{
    		ListNode *tem=l1;
    		l1=l2;
    		l2=tem;
		}
    	
		l1=reverse(l1);
		l2=reverse(l2);
		
		int cur=0,sum;
		ListNode *p1=l1,*p2=l2,*pre;
		while(p2)
		{
			pre=p1;
			sum=p1->val+p2->val+cur;
			p1->val=sum%10;
			cur=sum/10;
			p1=p1->next;
			p2=p2->next;
		}
		
		while(p1)
		{
			pre=p1;
			sum=p1->val+cur;
			p1->val=sum%10;
			cur=sum/10;
			p1=p1->next;
		}
		
		if(cur)
		{
			ListNode *tem=new ListNode (cur);
			tem->next=nullptr;
			pre->next=tem;
		}
		
		l1=reverse(l1);
		return l1;
    }
    
    ListNode* reverse(ListNode *head)
    {
    	ListNode *tem=new ListNode(0),*p=head,*r;
    	tem->next=nullptr;
    	
    	while(p)
    	{
    		r=p->next;
			p->next=tem->next;
			tem->next=p;
			p=r;	
		}
		
		head=tem->next;
		delete(tem);
		return head;
	}
	
	int len(ListNode *head)
	{
		int res=0;
		while(head)
		{
			res++;
			head=head->next;
		}
		
		return res;
	}
};

int main()
{
	return 0;
}
